package com.li.proxy.jdk;

import com.li.proxy.jdk.util.ProxyUtil;

import java.lang.reflect.Proxy;

public class Client {
    //客户端程序
    public static void main(String[] args) {
        //创建目标对象
        OrderService target = new OrderServiceImpl();

        //创建代理对象
        /**
         * newProxyInstance： 创建代理对象
         * 也就说通过调用这个方法可以创建代理对象
         * 本质上，这个newProxyInstance方法的执行做了两件事：
         *  1. 在内存中动态地生成了一个代理类的字节码 class
         *  2. new对象，通过内存中生成的代理类字节码，实例化了代理对象
         *  参数：
         *      ClassLoader loader 类加载器:
         *          在内存当中的生成的字节码，也是class文件，要执行也得先加载到内存当中，加载类就需要类加载器，所以这里需要指定类加载器
         *          并且JDK要求，目标类的类加载器必须和代理类的类加载器使用同一个
         *      Class<?>[] interfaces 代理类要实现的接口，
         *          代理类和目标类要实现同一个或同一些接口
         *          在内存中生成代理类的时候，这个代理类是需要你告诉它实现哪些接口的
         *      InvocationHandler h 调用处理器
         *          在调用处理器接口中编写的就是：增强代码
         *          既然是接口，就要写接口的实现类
         *          这种调用处理器写一次就好
         *  返回值：代理对象
         */
        OrderService proxy = (OrderService) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new TimerInvocationHandler(target));

        //调用代理对象的代理方法
        proxy.generate();
        String detail = proxy.detail();
        System.out.println(detail);
    }


    public void test2() {
        //封装一下就简洁了
        OrderService target = new OrderServiceImpl();
        OrderService proxy = (OrderService) ProxyUtil.newProxyInstance(target);
        proxy.generate();
        proxy.detail();
    }
}
